import 'dart:collection';

import 'package:eq/src/core.dart';

///解释器类
///
class Interpreter {
  static Interpreter? _instance;

  static Interpreter getInstance() {
    return _instance ??= Interpreter();
  }

  ///编译后模块,第一个module为执行脚本，其余为导入脚本,以文件路径作为模块唯一标志
  final HashMap<String, Module> module = HashMap<String, Module>();

  ///工程文件夹
  late final String proDir;

  ///pub文件夹
  final List<String> pubDir = List.empty(growable: true);

  ///主模块
  late final String mainModule;

  // ///是否为Debug运行
  // bool isDebug = false;
}

class Module {
  ///模块路径,唯一性
  final String name;

  ///模块是否被挂载,所有模块使用懒加载
  ///第一次调用模块时注册全局变量函数，可以没有
  ///主模块也可以使用全局变量函数
  bool _isLoad = false;

  bool get getLoad => _isLoad;

  set setLoad(bool load) => _isLoad = load;

  ///该模块依赖的包名(也可能是重命名)及其所在位置路径
  final HashMap<String, String> imp = HashMap();

  ///模块的函数，语句，全局变量
  final LinkedList<Variable> variable = LinkedList();
  final LinkedList<FunctionDefinition> functionList = LinkedList();
  final LinkedList<Statement> statementList = LinkedList();

  Module(this.name) {
    ///默认添加core库依赖
    imp.putIfAbsent("core", () => "eq.core");
  }

  @override
  String toString() {
    return " path:$name isLoad:$_isLoad import:$imp";
  }
}
